//有时我们希望这样的一种变量，它的值不能被改变

// #include <iostream>
// int main()
// {
//   constint bufSize = 512; //输入缓冲区的大小
//   //这样就把bufSize定义成了一个常量。任何试图为bufSize赋值的行为都将引发错误
//   // bufSize=512; error: 'bufSize' was not declared in this scope    错误：试图向const对象写值
//   return 0;
// }

//因为const对象一旦创建后其值就不能再改变，所以const对象必须初始化
//一如既往，初始值可以是任意复杂的表达式：
// #include <iostream>
// int main()
// {
//   const int i=get_size();   //正确：运行时初始化
//   const int j=42;           //正确：编译时初始化
//   const int k;              //错误：k是一个未经初始化的常量
//   return 0;
// }

// 初始化和const
// 1.默认状态下，const对象仅在文件内有效
// 2.当多个文件出现了同名的const变量时，其实等同于不同文件中分别定义了独立的变量

// // 3.对于这样的一种const变量，它的初始值不是一个常量表达式，但又确实有必要在多个文件间共享
// //解决办法：对于const变量不管时声明还是定义都添加extern关键字，这样只需定义一次
// // file_1.cc定义并初始化了一个常量，该常量能被其他文件访问
// extern const bufSize = fcn();
// // file_1.h头文件
// extern constint bufSize;       //与file_1.cc中的定义bufSize是同一个

// Note:如果想在多个文件之间共享const对象，必须在变量的定义之前添加extern关键字

// 2.4节练习
//  练习2.26：下面哪些句子是合法的？如果有不合法的句子，请说明为什么？
// (a) const int buf; //不合法，buf是一个未经初始化的常量
// (b) int cnt = 0;   //合法
// (c) const int sz = cnt;//合法
// (d)++ cnt;//合法
// ++sz;//不合法，sz是个常量，试图向const对象写值
//专业解答：
//（a）是非法的，const对象一旦创建后其值就不能改变，所以const对象必须初始化
//(d)sz是一个const对象，其值不能被改变，当然不能执行自增操作

// 2，4.1const的引用

// 1.可以把引用绑定到const对象上，（对常量的引用）
// 2.与普通引用不同的是，对常量的引用不能被用作修改它绑定的对象
// const int ci = 1024;
// const int &r1 = ci //正确：引用及其对应的对象都是常量
//     r1 = 42;       //错误：r1是对常量的引用
// int &r2 = ci;      //错误：试图让一个非常引用指向一个常量对象，r2是变量

//初始化和对const的引用
// 1.引用的类型必须与其所引用对象的类型一致，但是有两个例外
//第一种例外的情况就是在初始化常量引用时允许用任意表达式作为初始值，只要该表达式的结果能转换成引用的类型即可
//允许为一个常量引用绑定非常量的对象、字面值，甚至是一个表达式

// int i = 42;
// const int &r1 = i;      //允许将const int& 绑定到一个普通int 对象上
// const int &r2 = 42;     //正确：r2是一个常量引用
// const int &r3 = r1 * 2; //正确：r3是一个常量引用
// int &r4 = r1 * 2;       //错误：r4是一个普通的非常量引用

//对const的引用可能引用一个并非const的对象
//常量引用仅对引用可参与的操作做出了限定，对于引用的对象本身是不是一个常量未作限定
//因为对象也可能是个非常量，所以允许通过其他途径改变它的值

// #include <iostream>
// int main()
// {
//   int i = 42;
//   int &r1 = i;       //引用r1绑定对象i
//   const int &r2 = i; // r2也绑定对象i，但是不允许通过r2修改i的值
//   r1 = 0;            // r1并非常量，i的值修改为0
//   // r2=0; //错误：r2是一个常量引用
//   std::cout << r2 << std::endl;
//   return 0;
// }